#ifndef NODE_EXAMPLE_TALKER_H
#define NODE_EXAMPLE_TALKER_H
#include"ros/ros.h"
#include "ros/time.h"
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <math.h>
#include <string.h>
#include <tf/transform_broadcaster.h>
#include <nav_msgs/Odometry.h>
#include <sensor_msgs/Imu.h>
#include <sensor_msgs/MagneticField.h>
#include <sensor_msgs/Range.h>

#include <geometry_msgs/Quaternion.h>
#include <geometry_msgs/PoseStamped.h>
#include <Quaternion_Solution.h>
#include <serial/serial.h>
using namespace std;
using namespace boost::asio; 
using namespace boost;

#define PI 3.14159265                                                   //圆周率

class artcar
{
    public:         //声明函数
    artcar(ros::NodeHandle nh);
    ~artcar();
    void run();             //小车运行函数
    void pub_9250();                //发布mpu9250的数据
    void recvCarInforKernel();                  //接受从下位机发送过来的数据
    void sendCarInfoKernel();                   //发送数据到STM32进行控制
     void callback_move_base(const geometry_msgs::Twist::ConstPtr &msg);  

    //声明变量
    public:
        int m_baudrate;         //波特率
        string m_serialport;        //声明usb端口号
        int calibrate;                 //里程计标定参数
        float ticksPerMeter;        //一米脉冲数
        float ticksPer2PI;              //每圈的脉冲数
        serial::Serial ser;             //声明串口变量ser
        int encoder1,encoder2,encoder3,encoder4;
        float batteryVoltage;           //电池电压
        //IMU变量
        short tempaccelX,tempaccelY,tempaccelZ;         //加速度缓存区
        short tempgyroX,tempgyroY,tempgyroZ;             //角速度缓存区
        short tempmagX,tempmagY,tempmagZ;           //磁力计缓存区
        double accelX,accelY,accelZ;                                // 加速度
        double gyroX,gyroY,gyroZ;                                   //角速度
        double  magX,magY,magZ;                                     //磁力计
        int distanceA,distanceB;                                        //超声波距离值
        //cmd_vel变量
        float linear_speed,angular_speed;                   //速度和角速度变量，用于接收move_base下发的指令
        uint8_t SendBufer[8];                                                 //下发数据的结构体
        //里程计计算变量
        float linearSpeed,angularSpeed;                         //通过编码器解算获得的线速度和角速度 
        double detEncode;                                                   //编码器平均值 
        double velDeltaTime;                        //时间，存放转换成秒的时间
        double detdistance,detth;                   //计算距离和计算角度角度  
        int encoderleft;                           //左侧编码器值
        int encoderright;                        //右侧编码器值
        int finalencoderleft;                 //当前频率下左编码器最终值
         int finalencoderright;               //当前频率下右编码器最终值          


        

        //订阅话题句柄
         ros::Subscriber sub_move_base; // 订阅move_base 实现cmd_vel话题 
        //发布话题句柄
        ros::Publisher pub_imu;         //发布imu话题的句柄
        ros::Publisher pub_mag;             //发布磁力计话题的句柄
        ros::Publisher pub_odom;            //发布odom
};
#endif // NODE_EXAMPLE_TALKER_H